#include "spi_soft.h"

/**
 * @desc  : 初始化
 * @date  : 2024-12-04
 * @author: AnRui
 */
void SPI_SOFT_INIT() {
    /******************* GPIO **********************/
    // SCL 
    RCC_AHB1PeriphClockCmd(SPI_SOFT_CLK_RCU, ENABLE);
    GPIO_InitTypeDef gpio_battery;
    gpio_battery.GPIO_Pin = SPI_SOFT_CLK_PIN;
    gpio_battery.GPIO_Speed = GPIO_Speed_50MHz;
    gpio_battery.GPIO_Mode = GPIO_Mode_OUT;
    gpio_battery.GPIO_OType = GPIO_OType_PP;
    gpio_battery.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(SPI_SOFT_CLK_PORT, &gpio_battery);
    // MOSI
    RCC_AHB1PeriphClockCmd(SPI_SOFT_MOSI_RCU, ENABLE);
    gpio_battery.GPIO_Pin = SPI_SOFT_MOSI_PIN;
    GPIO_Init(SPI_SOFT_MOSI_PORT, &gpio_battery);
    // MISO
    RCC_AHB1PeriphClockCmd(SPI_SOFT_MISO_RCU, ENABLE);
    gpio_battery.GPIO_Pin = SPI_SOFT_MISO_PIN;
    gpio_battery.GPIO_Mode = GPIO_Mode_IN;
    gpio_battery.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(SPI_SOFT_MISO_PORT, &gpio_battery);
    /******************* io state ****************/
#if SPI0_CPOL
    SPI_SOFT_CLK(1);
#else
    SPI_SOFT_CLK(0);
#endif 
}


static void clk_start() {
#if SPI0_CPOL
    SPI_SOFT_CLK(1);
#else 
    SPI_SOFT_CLK(0);
#endif

}

static void clk_end() {
#if SPI0_CPOL
    SPI_SOFT_CLK(0);
#else 
    SPI_SOFT_CLK(1);
#endif
}

/**
 * @desc  : 写数据
 * @date  : 2024-12-04
 * @author: AnRui
 * @param :  data - {参数说明}:
 */
void SPI_SOFT_WRITE_BYTE(uint8_t data) {
    uint8_t i;
    for (i = 0; i < 8; i++) {
        clk_start();
        if (data & 0x80)
            SPI_SOFT_MOSI(1);
        else
            SPI_SOFT_MOSI(0);
        clk_end();
        data <<= 1;
    }
    clk_start();
}

/**
 * @desc  : 读数据
 * @date  : 2024-12-04
 * @author: AnRui
 * @return: uint8_t
 */
uint8_t SPI_SOFT_READ_BYTE() {
    uint8_t i, read = 0;
    for (i = 0; i < 8; i++) {
        clk_start();
        read <<= 1;
        if (SPI_SOFT_MISO_STATE()) {
            read++;
        }
        clk_end();
    }
    clk_start();
    return read;
}